package com.sport.setting.repository;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sport.model.common.dtos.ResponseResult;
import com.sport.model.setting.dtos.SportEventsGradeSettingDto;
import com.sport.model.setting.dtos.SportPreInfoSettingDto;
import com.sport.model.setting.dtos.SportPreInfoUpdateDto;
import com.sport.model.setting.pojos.SportEventsGrade;
import com.sport.model.setting.pojos.SportPreInfo;

import com.sport.setting.mapper.SportPreInfoMapper;
import com.sport.utils.common.BaseUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Component
@Transactional
public class SportPreInfoRepository extends ServiceImpl<SportPreInfoMapper, SportPreInfo> {

    private SportPreInfo sportPreInfo;

    private SportPreInfoMapper sportPreInfoMapper;

    public SportPreInfoRepository(@Autowired SportPreInfoMapper sportPreInfoMapper) {
        this.sportPreInfoMapper = sportPreInfoMapper;
        if (sportPreInfo == null) sportPreInfo = new SportPreInfo();
    }

    public SportPreInfo getPreInfo(String schoolTenementId) {
        SportPreInfo target = BaseUtils.copyProperties(getOne(Wrappers.<SportPreInfo>lambdaQuery()
                .eq(SportPreInfo::getSchoolTenementId, schoolTenementId)
                .eq(SportPreInfo::getSportStatus, 1)
        ), SportPreInfo.class);

        if (target == null) return BaseUtils.copyProperties(getOne(Wrappers.<SportPreInfo>lambdaQuery()
                .eq(SportPreInfo::getSchoolTenementId, schoolTenementId)
                .eq(SportPreInfo::getSportStatus, 0)
        ), SportPreInfo.class);

        return target;
    }

    public ResponseResult initSportMeeting(String schoolTenementId) {
        sportPreInfo.setSchoolTenementId(schoolTenementId);
        sportPreInfoMapper.insert(sportPreInfo);
        return ResponseResult.okResult(sportPreInfo.getSportId());
    }

    public SportPreInfo createSportMeeting(SportPreInfoSettingDto sportPreInfoSettingDto) {
        sportPreInfo = BaseUtils.copyProperties(sportPreInfoSettingDto, SportPreInfo.class);
        sportPreInfo.setSportStatus(1);
        sportPreInfoMapper.update(
                sportPreInfo
                , Wrappers.<SportPreInfo>lambdaUpdate().eq(SportPreInfo::getSchoolTenementId, sportPreInfoSettingDto.getAccountUserBo().getSchoolTenementId())
        );
        return sportPreInfo;
    }

    //TODO：如果其他参数都为空，该条数据是否有效
    public SportPreInfo updateSportMeeting(SportPreInfoUpdateDto sportPreInfoUpdateDto) {
        sportPreInfo = BaseUtils.copyProperties(sportPreInfoUpdateDto, SportPreInfo.class);
        sportPreInfoMapper.update(
                sportPreInfo
                , Wrappers.<SportPreInfo>lambdaUpdate()
                        .eq(SportPreInfo::getSchoolTenementId, sportPreInfoUpdateDto.getAccountUserBo().getSchoolTenementId())
                        .eq(SportPreInfo::getSportId, sportPreInfoUpdateDto.getAccountUserBo().getSportId())
                        .eq(SportPreInfo::getSportStatus, sportPreInfoUpdateDto.getAccountUserBo().getSportStatus())
        );
        return sportPreInfo;
    }

    public void insertSportGrade(SportEventsGradeSettingDto sportEventsGradeSettingDto) {
        if (sportEventsGradeSettingDto.getControlTargetGrade() == null)
            return ;

        sportPreInfoMapper.insertSportGrade(sportEventsGradeSettingDto);
    }

    public void deleteSportGrade(SportEventsGradeSettingDto sportEventsGradeSettingDto) {
        if (sportEventsGradeSettingDto.getControlTargetGrade() == null)
            return ;

        sportPreInfoMapper.deleteSportGrade(sportEventsGradeSettingDto);

    }

    public List<String> returnSportGradeList(String schoolTenementId) {

        List<SportEventsGrade> sportEventsGrades = sportPreInfoMapper.obtainSportEventsGrade(schoolTenementId);
        List<String> returnsRecord = new ArrayList<>();

        sportEventsGrades.forEach((value)->{
            returnsRecord.add(value.getSportEventsGrade());
        });

        return returnsRecord;
    }

    public List<String> getSportOriginGrade(String schoolTenementId) {
        List<String> sportOriginGrade = sportPreInfoMapper.getSportOriginGrade(schoolTenementId);

        return sportOriginGrade;
    }
}
